package com.ai.mall.service.impl;

import com.ai.mall.dao.UsersDao;
import com.ai.mall.entity.UsersEntity;
import com.ai.mall.service.UsersService;
import com.ai.mall.utils.PageUtils;
import com.ai.mall.utils.Query;
import com.ai.mall.utils.R;
import com.ai.mall.vo.req.UserRegisterRequest;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;


@Service("usersService")
public class UsersServiceImpl extends ServiceImpl<UsersDao, UsersEntity> implements UsersService {
    @Autowired
    private UsersDao usersDao;

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<UsersEntity> page = this.page(
                new Query<UsersEntity>().getPage(params),
                new QueryWrapper<UsersEntity>()
        );

        return new PageUtils(page);
    }

    public R login(String username, String password) {
        // 根据用户名查询用户信息
        UsersEntity user = getBaseMapper().selectOne(new QueryWrapper<UsersEntity>().eq("username", username));
        // 检查用户是否存在
//        UsersEntity user = usersDao.selectByUsername(username);
        if (user == null) {
            return R.error("用户名不存在");
        }

        // 检查密码是否匹配，这里假设密码是明文存储的，实际项目中应该使用加密存储
        if (!user.getPassword().equals(password)) {
            return R.error("密码错误");
        }

        // 登录成功，可以在这里生成token或其他登录后的处理逻辑
        // 例如：生成JWT token
//        String token = null;
//        try {
//            token = generateJwtToken(user);
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }
        // 返回登录成功信息以及token
        return R.ok().put("user", user);
    }

    /**
     * 用户注册方法
     * 该方法负责处理用户注册请求，确保用户信息的有效性，检查用户是否已存在，
     * 并将新用户信息保存到数据库中。
     *
     * 参数：
     * @param userRegisterRequest 用户注册请求对象，包含用户名、密码和电话号码等信息
     *
     * 返回值：
     * @return R 返回结果对象，包含注册成功或失败的信息，以及成功时的用户信息
     */
    @Override
    public R register(UserRegisterRequest userRegisterRequest) {
        // 验证用户信息
        if (userRegisterRequest == null || !userRegisterRequest.isValid()) {
            return R.error().put("msg", "Invalid user registration request");
        }

        // 检查用户是否已存在
        if (usersDao.selectByUsername(userRegisterRequest.getUsername()) != null) {
            return R.error().put("msg", "User already exists");
        }

        // 创建用户对象
        UsersEntity user = new UsersEntity();
        user.setUsername(userRegisterRequest.getUsername());
        user.setPassword(userRegisterRequest.getPassword());
        user.setPhone(userRegisterRequest.getPhone());

        // 保存用户到数据库
        try {
            usersDao.insert(user);
        } catch (Exception e) {
            return R.error().put("msg", "Failed to register user");
        }

        // 返回注册成功信息
        return R.ok().put("msg", "User registered successfully").put("user", user);
    }



}